﻿/*************************************************************************************
 * 文 件 名:   HK_MakeGroup
 * 
 * 描    述:   该工具用于将选中的多个 Unity 游戏对象（GameObjects）打组操作。生成一个新的父对象，将所有选中的对象作为该新父对象的子对象，并将新父对象在层次视图中位置与第一个选中物体保持一致。
 * 
 * 版    本：  V1.2
 * 创 建 者：  京产肠饭
 * 创建时间：  2021/8/25
 * 链   接：  https://gitee.com/JingChanChangFan/hk_-unity-tools
*************************************************************************************/

using UnityEditor;
using UnityEngine;

namespace HKTools
{
    [InitializeOnLoad]
    public class HK_MakeGroup
    {
        const int MakeGroupPriority = 1;

        [MenuItem("HKTools/MakeGroup(打组工具) %g", validate = true, priority = MakeGroupPriority)]
        static bool MakeGroupValidate()
        {
            return HK_ToolStates.IsActiveMakeGroup;
        }

        [MenuItem("HKTools/MakeGroup(打组工具) %g", priority = MakeGroupPriority)]
        public static void MakeGroup()
        {
            var selectedObjs = Selection.gameObjects;

            if (selectedObjs.Length == 0)
            {
                Debug.LogError("HK_MakeGroup: 未选中物体，无法执行打组操作!");
                return;
            }

            GameObject go;

            if (selectedObjs[0].GetComponent<RectTransform>() != null)
            {
                go = new GameObject("Parent_Go", typeof(RectTransform));
            }
            else
            {
                go = new GameObject("Parent_Go");
            }

            // 保持一致的层次结构
            go.transform.SetParent(selectedObjs[0].transform.parent, false);
            go.transform.SetSiblingIndex(selectedObjs[0].transform.GetSiblingIndex()); // 设置层级与第一个选中物体保持一致

            Undo.RegisterCreatedObjectUndo(go, "CreateParent");

            Vector3 pos = Vector3.zero;

            foreach (var item in selectedObjs)
            {
                pos += item.transform.position;
            }

            pos = pos / selectedObjs.Length;

            go.transform.position = pos;

            foreach (var item in selectedObjs)
            {
                Undo.SetTransformParent(item.transform, go.transform, "SetParent");
            }

            Selection.activeGameObject = go;
        }
    }
}